package com.example.mq.common;

import java.io.*;

/**
 * 这个类能让对象序列化成二进制数据，也能让二进制数据反序列化成java对象
 * 但实现上述的前提是要实现Serializable接口（空接口类似于Clonable）
 */
public class BinaryTool {
    //序列化
    public static byte[] toBytes(Object o) throws IOException {
        //由于传入的参数是一个变长的对象，所以使用ByteArrayOutputStream流对象就相当于一个变长的数组
        //就可以把object序列化的二进制数据写入ByteArrayOutputStream，最终在统一转化成byte数组
        try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                //这个方法就是将object对象序列化，并写入到ObjectOutputStream中
                //由于ObjectOutputStream关联到ByteArrayOutputStream，所以最终序列化后的数据会写入到ByteArrayOutputStream中
                objectOutputStream.writeObject(o);
            }
            return byteArrayOutputStream.toByteArray();
        }
    }
    //反序列化
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
                // 此处的 readObject, 就是从 data 这个 byte[] 中读取数据并进行反序列化.
                object = objectInputStream.readObject();
            }
        }
        return object;
    }
}
